﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TwoDimensionArray
{
    class Program
    {
        static void Main(string[] args)
        {
            int choise;
            Console.WriteLine(@"Введите номер программы 1-7
1 - Создается 2-х мерный массив размером a на b элементов, заполненный случайными числами. Заменить последний элемент каждой строки суммой предыдущих элементов этой строки.
2 - Создается метод, который выведет на экран календарь на месяц. Необходимо указать количество дней в месяце и с какого дня недели начинается месяц.
3 - Пользователь задает размер квадратного двухмерного массива. Найти сумму элементов расположенных на главной диагонале.
4 - Посчитать количество четных и нечетных элементов в массиве.
5 - Создается массив из n строк и m столбцов. Найти максимальный из наименьших элементов столбцов.
6 - Посчитать сумму элементов отдельно в каждом столбце и каждой строке.
7 - Найти произведение ненулевых элементов массива.");
            choise = Int32.Parse(Console.ReadLine());
            if (choise > 0 && choise < 8)
            {
                switch (choise)
                {
                    case 1:
                        CountArrayAndChangeLastNumber();
                        break;
                    case 2:
                        Console.WriteLine("Введи количество дней в месяце ");
                        int AmountOfDays = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Введи с какого дня недели начинается месяц (1-7)");
                        int StartDayOfWeek = Int32.Parse(Console.ReadLine());
                        ShowCalendar(AmountOfDays, StartDayOfWeek);
                        break;
                    case 3:
                        Console.WriteLine("Введи количество строк ");
                        int testRow = Int32.Parse(Console.ReadLine());
                        Console.WriteLine("Введи количество колонок ");
                        int testColumn = Int32.Parse(Console.ReadLine());
                        if (testRow == testColumn)
                        {
                            int[,] testArray = CalculateMainDiagonal(testRow, testColumn);
                            PrintArray(testArray);
                        }
                        else
                            Console.WriteLine("Вы ввели данные не соответствующие квадратному массиву!");
                        break;
                    case 4:
                        CountEvenOddNumbers();
                        break;
                    case 5:
                        FindMaxFromMin();
                        break;
                    case 6:
                        FindSumInColumnsAndRows();
                        break;
                    case 7:
                        СompositionNumbersNotZero();
                        break;
                }
            }
            else
                Console.WriteLine("Вы ввели неправильное значение, программа прекращает работу!");
        }
        static void CountArrayAndChangeLastNumber()
        {
            int [,] array = GetValuesAndFillInArray();
            Console.WriteLine("Преобразованный массив:");
            for (int i = 0; i < array.GetLength(0); i++)
            {
                int Sum = 0;
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    if (j == (array.GetLength(1)-1))
                        array[i, j] = Sum;
                    else
                        Sum += array[i, j];
                }
            }
            PrintArray(array);
        }
        static void PrintArray(int[,] arrayForPrint)
        {
            for (int i = 0; i < arrayForPrint.GetLength(0); i++)
            {
                for (int j = 0; j < arrayForPrint.GetLength(1); j++)
                {
                    Console.Write("{0}\t", arrayForPrint[i, j]);
                }
                Console.WriteLine();
            }
        }
        static int[,] GetValuesAndFillInArray ()
        {
            Console.WriteLine("Введи количество строк ");
            int Row = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введи количество колонок ");
            int Column = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введи минимальное значение ");
            int MinValue = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введи максимальное значение ");
            int MaxValue = Int32.Parse(Console.ReadLine());
            int[,] array = new int[Row, Column];
            Random RandomNumber = new Random();
            for (int i = 0; i < Row; i++)
            {
                for (int j = 0; j < Column; j++)
                {
                    array[i, j] = RandomNumber.Next(MinValue, MaxValue);
                }
            }
            Console.WriteLine("Исходный массив:");
            PrintArray(array);
            return array;
        }
        static void ShowCalendar(int AmountOfDaysInMonth, int StartDayOfWeek)
        {
            Console.WriteLine("Mon\tTue\tWed\tThu\tFri\tSat\tSun");
            byte DayCounter = 1;
            int[,] DayOfMonth = new int[6, 7];
            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                    if (i == 0 && j < StartDayOfWeek-1)
                    {
                        DayOfMonth[i, j] = 0;
                    }
                    else
                    {
                        DayOfMonth[i, j] = DayCounter;
                        if (DayCounter <= AmountOfDaysInMonth)
                        {
                            DayCounter++;
                        }
                        else
                        {
                            DayOfMonth[i, j] = 0;
                        }
                    }
                }
            }
            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                    if (DayOfMonth[i, j] == 0)
                    {
                        Console.Write(" \t");
                    }
                    else
                        Console.Write("{0}\t", DayOfMonth[i, j]);
                }
                Console.WriteLine();
            }
        }
        static int[,] CalculateMainDiagonal(int Row, int Colums)
        {
            int MainDiagonalSum = 0;
            int[,] SquareArray = new int[Row, Colums];
            Random rndm = new Random();
            for (int i = 0; i < Row; i++)
            {
                for (int j = 0; j < Colums; j++)
                {
                    SquareArray[i, j] = rndm.Next(-100, 100);
                    if (i == j)
                    {
                        MainDiagonalSum += SquareArray[i, j];
                    }
                }
            }
            Console.WriteLine("Сумма главной диагонали {0}", MainDiagonalSum);
            return SquareArray;
        }
        static void CountEvenOddNumbers()
        {
            int[,] array = GetValuesAndFillInArray();
            int CountEven = 0;
            int CountOdd = 0;
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    if (array[i, j] % 2 == 0)
                    {
                        CountEven++;
                    }
                    else
                    {
                        CountOdd++;
                    }
                }
            }
            Console.WriteLine("Четных {0} Нечетных {1}", CountEven, CountOdd);
        }
        static void FindMaxFromMin()
        {
            int[,] array = GetValuesAndFillInArray();
            int[] MinNumbersFromArray = new int[array.GetLength(0)];
            for (int i = 0; i < array.GetLength(0); i++)
            {
                int MinValue = Int32.MaxValue;
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    if (array[i, j] < MinValue)
                    {
                        MinValue = array[i, j];
                    }
                }
                MinNumbersFromArray[i] = MinValue;
            }
            Console.WriteLine("Минимальные числа в рядах");
            foreach (int number in MinNumbersFromArray)
                Console.WriteLine("Минимальное значение строки: {0}", number);
            Console.WriteLine("Максимальный из наименьших элементов столбцов {0}", MinNumbersFromArray.Max());
        }
        static void FindSumInColumnsAndRows()
        {
            byte counter = 0;
            int SumInColumn = 0;
            int[,] array = GetValuesAndFillInArray();
            int[] SumInRowArray = new int[array.GetLength(0)];
            int[] SumInColumnArray = new int[array.GetLength(1)];
            for (int i = 0; i < array.GetLength(0); i++)
            {
                int SumInRow = 0;
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    SumInRow += array[i, j];
                    SumInColumn += array[i, counter];
                }
                counter++;
                SumInRowArray[i] = SumInRow;
                SumInColumnArray[i] = SumInColumn;
            }
            for (int i =0; i< SumInRowArray.Length; i++)
                Console.WriteLine("Сумма {0} строки: {1}", i+1, SumInRowArray[i]);
            foreach (int sum in SumInColumnArray)
                Console.WriteLine("Сумма столбца: {0}", sum);
        }
        static void СompositionNumbersNotZero ()
        {
            int[,] array = GetValuesAndFillInArray();
            long СompositionNumbersNotZero = 1;
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    if (array[i, j] != 0)
                    {
                        СompositionNumbersNotZero *= array[i, j];
                    }
                }
            }
            Console.WriteLine("Произведение ненулевых значений массива равно {0}", СompositionNumbersNotZero);
        }
    }
}